Spring Boot

您所在的位置:网站首页 localdatetime string 转换 Spring Boot

Spring Boot

2024-03-03 01:33| 来源: 网络整理| 查看: 265

 在项目中日期格式化是最常见的问题,之前涉及的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,非线程安全,对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,从 Calendar 中获取的月份需要加一才能表示当前月份。

在 JDK8 中,一个新的重要特性就是引入了全新的时间和日期API,它被收录在 java.time 包中,借助新的时间和日期API可以以更简洁的方法处理时间和日期。

解决方案

1、注解

(1) @JsonFormat和@DateTimeFormat

@JsonFormat后台到前台的时间格式的转换

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

pattern:需要转换的时间日期的格式

timezone:是时间设置为东八区

@DateTimeFormat前后到后台的时间格式的转换

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

pattern:需要转换的时间日期的格式

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime dateTime;

(2)Controller

@GetMapping("date") public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) { return date; } @GetMapping("date2") public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { return date; }

2、统一配置

配置文件配置

spring: jackson: date-format: yyyy-MM-dd HH:mm:ss

代码配置

RequestParam|PathVariable参数

Converter

@Configuration public class DateConfig { @Bean public Converter localDateConverter() { return new Converter() { @Override public LocalDate convert(String source) { return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd")); } }; } @Bean public Converter localDateTimeConverter() { return new Converter() { @Override public LocalDateTime convert(String source) { return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } }; } }

使用ControllerAdvice配合initBinder

@ControllerAdvice public class GlobalExceptionHandler { @InitBinder protected void initBinder(WebDataBinder binder) { binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd"))); } }); binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } }); binder.registerCustomEditor(LocalTime.class, new PropertyEditorSupport() { @Override public void setAsText(String text) throws IllegalArgumentException { setValue(LocalTime.parse(text, DateTimeFormatter.ofPattern("HH:mm:ss"))); } }); } }

JSON格式

定义一个配置类,对ObjectMapper对象进行定制,指定日期类对应的序列化与反序列化处理对象

方案一

@Configuration public class LocalDateTimeFormatConfig { private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd"; private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss"; @Bean @Primary public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); objectMapper.registerModule(javaTimeModule); return objectMapper; } }

方案二

@Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; @Bean @Primary public ObjectMapper serializingObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); objectMapper.registerModule(javaTimeModule); return objectMapper; } public class LocalDateTimeSerializer extends JsonSerializer { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.format(DateTimeFormatter.ofPattern(pattern))); } } public class LocalDateTimeDeserializer extends JsonDeserializer { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException { return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern(pattern)); } } }

方案三 

/** * @Author ShenTuZhiGang * @Version 1.0.0 * @Date 2020-03-29 19:23 */ @Configuration //@EnableWebMvc public class CustomWebMvcConfigurer implements WebMvcConfigurer { private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd"; private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss"; /** * 统一输出风格 * See {@link com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy} for details. * @param converters */ @Override public void extendMessageConverters(List> converters) { for (int i = 0; i < converters.size(); i++) { if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter)converters.get(i); ObjectMapper objectMapper = converter.getObjectMapper(); // 统一返回数据的输出风格 objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy()); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); break; } } } /** * LocalDate转换器,用于转换RequestParam和PathVariable参数 */ @Bean public Converter localDateConverter() { return new Converter() { @Override public LocalDate convert(String source) { return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)); } }; } /** * LocalDateTime转换器,用于转换RequestParam和PathVariable参数 */ @Bean public Converter localDateTimeConverter() { return new Converter() { @Override public LocalDateTime convert(String source) { return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN)); } }; } /** * LocalTime转换器,用于转换RequestParam和PathVariable参数 */ @Bean public Converter localTimeConverter() { return new Converter() { @Override public LocalTime convert(String source) { return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)); } }; } /** * Date转换器,用于转换RequestParam和PathVariable参数 */ @Bean public Converter dateConverter() { return new Converter() { @Override public Date convert(String source) { SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_PATTERN); try { return format.parse(source); } catch (ParseException e) { throw new RuntimeException(e); } } }; } /** * Json序列化和反序列化转换器,用于转换POST请求体中的json以及将我们的对象序列化为返回响应的json */ @Bean public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); //LocalDateTime系列序列化和反序列化模块,继承自jsr310,我们在这里修改了日期格式 JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); //Date序列化和反序列化 javaTimeModule.addSerializer(Date.class, new JsonSerializer() { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_PATTERN); String formattedDate = formatter.format(date); jsonGenerator.writeString(formattedDate); } }); javaTimeModule.addDeserializer(Date.class, new JsonDeserializer() { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_PATTERN); String date = jsonParser.getText(); try { return format.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } }); objectMapper.registerModule(javaTimeModule); return objectMapper; } } 参考文章

LocalDateTime在spring boot中的格式化配置

Spring Boot(十二):LocalDateTime格式化处理

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") pattern:需要转换的时间日期的格式

Spring中使用LocalDateTime、LocalDate等参数作为入参数据转换问题

SpringBoot在Controller中接收LocalDate/LocalDateTime

Spring Boot LocalDateTime格式处理

Springboot - 处理LocalDateTime的入参和出参格式



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3